package com.atguigu.java;

/**
 * 例子：创建三个窗口卖票，总票数为100张
 * <p>
 * 目前存在线程安全问题，待解决
 * 说明：在继承Thread类创建多线程的方式中，慎用this充当同步监视器。我们可以考虑使用this来充当同步监视器
 *
 * @Description
 * @Author codingBee
 * @Date 2020/8/20/7:49
 */
public class WindowTest {
    public static void main(String[] args) {
        Window window1 = new Window("窗口1");
        Window window2 = new Window("窗口2");
        Window window3 = new Window("窗口3");
        window1.start();
        window2.start();
        window3.start();


    }
}

class Window extends Thread {
    private static int ticket = 100;
    private static Object object = new Object();

    public Window(String name) {
        super(name);
    }

    public Window() {
    }

    @Override
    public void run() {
        while (true) {
//            synchronized (object) {
//            synchronized (this) { //错误的写法，因为这里指的是当前类的对象，但是实际使用的时候实例化了3个，所以在此处this是不唯一的
            synchronized (Window.class) { //Window.class只会加载一次，所以这个是唯一的。就可以充当同步代码块中的同步监视器了
                if (ticket > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + ":卖票，票号为：" + ticket);
                    ticket--;
                } else {
                    break;
                }

            }
        }
    }
}